package com.cy.pj.sys.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.cy.pj.common.pojo.CheckBox;
import com.cy.pj.common.pojo.PageObject;
import com.cy.pj.sys.dao.SysRoleDao;
import com.cy.pj.sys.dao.SysRoleMenuDao;
import com.cy.pj.sys.dao.SysUserRoleDao;
import com.cy.pj.sys.pojo.SysRole;
import com.cy.pj.sys.pojo.SysRoleMenu;
import com.cy.pj.sys.service.SysRoleService;

@Service
public class SysRoleServiceImpl implements SysRoleService {

	@Autowired
	private SysRoleDao sysRoleDao;
	
	@Autowired
	private SysRoleMenuDao sysRoleMenuDao;
	
	@Autowired
	private SysUserRoleDao sysUserRoleDao;
	
	
	/**
	 * 查询所有角色
	 */
	@Override
	public PageObject<SysRole> findPageObject(String name, Integer pageCurrent) {
		//参数校验
		if(pageCurrent==null||pageCurrent<1)
			throw new IllegalArgumentException("出现意外错误，请刷新页面重试");
		//统计一起有多少条记录
		int rowCount = sysRoleDao.getRowCount(name);
		if(rowCount==0)
			throw new IllegalArgumentException("系统没有查询到此用户");
		int pageSize=5;//定义一次查询多少条
		int startIndex=(pageCurrent-1)*pageSize;//定义从哪里开始查
		//根据条件开始查询记录并返回封装数据
		List<SysRole> records = sysRoleDao.findPageObject(name, startIndex, pageSize);
		return new PageObject<>(pageCurrent, pageSize, rowCount, records);
	}


	/**
	 * 删除角色
	 */
	@Override
	public int deleteObejct(Integer id) {
		//参数校验
		if(id==null||id<1)
			throw new IllegalArgumentException("参数无效，请刷新页面重试");
		//删除角色菜单关系数据
		sysRoleMenuDao.deleteObjectsByRoleId(id);
		//删除用户角色关系数据
		sysUserRoleDao.deleteObjectsByRoleId(id);
		//删除角色自身信息
		int rows = sysRoleDao.deletrObject(id);
		//校验参数
		if(rows==0)
			throw new IllegalArgumentException("记录可能已经被删除");
		return rows;
	}


	//新增角色
	@Override
	public int saveObject(SysRole entity, Integer[] menuIds) {
		//基本参数校验
		if(entity==null)
			throw new IllegalArgumentException("保存对象不能为空");
		if(StringUtils.isEmpty(entity.getName()))
			throw new IllegalArgumentException("角色名不能为空");
		if(menuIds==null||menuIds.length==0)
			throw new IllegalArgumentException("请至少为角色分配一个权限");
		//保存自身信息
		int rows = sysRoleDao.insertObject(entity);//执行完此语句以后，entity对象中会存储一个id值
		//保存角色与菜单关系
		sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
		return rows;
	}


	/*方案1：业务层查询多次
	 * @Override 
	 * public SysRoleMenu findById(Integer id) { 
	 * 校验参数 if(id==null||id<1)
	 * 		throw new IllegalArgumentException("Id值无效"); 
	 * 查询角色自身信息 
	 * SysRoleMenu sysRoleMenu = sysRoleDao.findById(id); 
	 * 查询角色对应的菜单id 
	 * List<Integer> menuIds = sysRoleMenuDao.findMenuIdsByRoleId(id); //封装结果并返回
	 * sysRoleMenu.setMenuIds(menuIds); 
	 * return sysRoleMenu; 
	 * }
	 */
	
	//方案2：业务层只查询一次
	@Override
	public SysRoleMenu findById(Integer id) {
		//校验参数
		if(id==null||id<1)
			throw new IllegalArgumentException("Id值无效");
		//查询角色自身信息
		SysRoleMenu sysRoleMenu = sysRoleDao.findById(id);
		return sysRoleMenu;
	}

	
	//更新角色信息
	@Override
	public int updateObject(SysRole entity, Integer[] menuIds) {
		//参数校验
		if(entity==null)
			throw new IllegalArgumentException("保存对象不能为空");
		if(StringUtils.isEmpty(entity.getName()))
			throw new IllegalArgumentException("角色名不能为空");
		if(menuIds==null||menuIds.length==0)
			throw new IllegalArgumentException("请至少为角色分配一个权限");
		//更新角色自身信息
		int rows = sysRoleDao.updataObject(entity);
		if(rows==0)
			throw new IllegalArgumentException("记录可能已经被删除，请刷新页面重试");
		//删除原来角色关系数据
		sysRoleMenuDao.deleteObjectsByRoleId(entity.getId());
		//写入新的关系数据
		sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
		return rows;
	}


	//此处为在用户管理页面时，添加新用户时查询所有的角色信息出来供用户选择
	@Override
	public List<CheckBox> findObject() {
		return sysRoleDao.findObject();
	}

}
